iT邦幫忙

2024 iThome 鐵人賽

DAY 23
1
Python

用 Python 打造你的 Discord BOT系列 第 23

[Day 23] 部屬 (一):部屬觀念 與 Replit 美好的過去

  • 分享至 

  • xImage
  •  

讓我們進入到最後階段,開始學習如何部屬 Discord BOT 吧!

進度

今天的標題比較聳動。

原本照預期規劃是要介紹三個可以免費部屬 Discord BOT 的平台:

  • Replit
  • Google Cloud Platform (GCP)
  • Render

殊不知,Replit 後來有改版,導致它現在很難免費部屬了,所以才說是 Replit 美好的過去。也因此,今天的內容只好改成討論部屬的觀念,以及為什麼 Replit 改版後就不能免費部屬了。(也因此,塗個橘色表示這個沒有照預期的進度 QQ)

為什麼要部屬?

想必大家應該有發現,Discord BOT 只有在執行程式時才會上線 (也才會有反應),一旦把程式關閉,Discord BOT 就會立刻下線。換句話說,如果希望 Discord BOT 可以 24 小時隨時隨地的為大家服務的話,就必須要找一台電腦持續地執行程式才行。而這個「找一台電腦去持續執行程式」的動作,就是所謂的「部屬」。

部屬在哪裡?

基本上,部屬在任何一台電腦上都可以,只要它能夠長時間不關機並且有足夠的能力去執行 Discord BOT 程式就好。但是,並非人人家裡都有多餘且能夠 24 小時不關機的電腦,因此,另外找一個可以執行程式的電腦就很重要。此時,雲端平台就會是一個好選擇。

不論是租用一個雲端主機還是使用雲端服務,都可以省去很多麻煩。大家不必真的花一筆錢去買實體主機,也不用煩惱要放在哪裡,更不用找人來幫忙管理主機。但是,取而代之的是,雲端平台會有收費機制,畢竟沒人會想做賠本生意嘛!

不過,好在有些平台都有一定的免費額度或免費的服務,對於小型的 Discord BOT 來說綽綽有餘,非常建議大家先挑一個平台部屬看看。如果未來真的事業越做越大,可以再來慢慢考慮要不要花點錢提升規格。

部屬的注意事項

在部屬時,有幾點需要注意:

1. 機敏資訊

平時在自己電腦上開發時,帳號、密碼、金鑰等比較敏感的資訊要怎麼放在程式碼中其實沒那麼重要。但是,一旦這個專案會被公開在網路上時,就不能這麼隨意了。尤其是像 Github 這類的程式碼平台,連 Git 紀錄也會一併上傳,只要這些機敏資訊曾經出現在網路上,都有可能被別人翻出來。而部屬時也是一樣,這些機敏資訊也不該放在公開的地方。

但是,難免會有需要在程式碼中設定機敏資訊的需求 (例如:執行 Discord BOT 就需要帶入 Token),此時,環境變數就是很好的工具。透過使用線上平台的 secrets 功能 (幾乎都有),就可以在公開的專案中設定這些不公開的機敏資訊到環境變數中,之後只要在程式碼中進行讀取就好。

以 Python 為例,只要使用

token = os.getenv("TOKEN")

就可以把環境變數中的 TOKEN,傳送到程式碼中的 token 了。

2. 費用

再來就是費用了,手頭寬裕的人選項自然很多,但如果是希望找免費資源的人,請記得一定要看清楚免費額度與條件。而且,這個規則有可能在未來發生變化 (就像當年的 Heroku ...),所以還是要多加注意!

3. 規格

通常在 side project 類型的小專案,硬體規格都不用太高,免費方案下的規格都很夠用。但如果之後事業越做越大,在挑選平台的時候就要記得把規格納入考量。

Replit

接下來,來聊聊 Replit 這個曾經非常適合部屬 Discord BOT 的平台。

Replit 是一個程式線上開發平台,它支援超過 50 種程式語言,使用者不用安裝任何軟體就可以直接在瀏覽器上直接編寫、執行、分享程式碼,甚至也支援協作功能。Replit 對於遠端合作或是教學來說都是一個很棒的選擇。

Replit 改了什麼?

前面有說過,它以前適合免費部屬 Discord BOT,但改版後的現在就不適合了。在解釋之前,要先說明一下原本的機制。

分配運算資源

Replit 作為一個線上程式開發平台,運算資源的有效分配是一個很重要的議題。每個使用者啟動程式的時候就需要分配資源給它,反之,一旦使用者不再使用時就要把資源收回來。如果使用者執行程式到一半就把網頁關掉,一樣也會把資源給收回來。

所以,如果只是單純的把 Discord BOT 程式直接放上 Replit 平台執行,它雖然可以正常運作,但也逃不掉「關閉網頁就會停止執行」的命運,就算是之前的版本也是。

換個角度思考,如果可以一直讓 Replit 認為正在使用這個程式的話,就能夠一直持有運算資源,Discord BOT 就可以一直在線了。所以,問題就變成:

  • 如何讓 Replit 認為這個程式一直處於使用中的狀態 (即使網頁被關掉)?

如何營造程式被持續使用的假象?

要做到這件事,核心思路如下:

  1. 開啟一個新的 thread,在裡面啟動一個簡單的後端 server
  2. Replit 會自動把後端 server 部屬上線,並在預覽畫面中呈現網址
  3. 使用 UptimeRobot,定時檢查這個後端 server 的狀態,營造一種它有被持續使用的假象

這部分的教學蠻多的,這邊列舉幾個,有興趣的人可以參考:

改版內容

確切的細節我不清楚,但目前測試下來的感覺是,現在的 Replit 會去檢查是否還有人在 Replit 專案的網頁上,一但發現沒有,後端 server 部屬的網址就會失效。也就是說,單靠一個 UptimeRobot 已經無法滿足需求,還需要有另一個工具可以一直開著專案。

不過,如果我可以一直開著專案,那我還要 UptimeRobot 幹嘛XD

所以,總歸一句話就是,Replit 已經不適合免費仔 (就是我) 部屬 Discord BOT 了。

那就... 換個平台吧!

雖然 Replit 已經不再是合適的選項,但是這個思路其實挺讚的,可以找別的地方繼續沿用。因此,只要找一個可以免費部屬後端 server 的平台就好啦!

Render,就是一個很好的選擇。

不過,礙於篇幅考量,Render 就留到明天再繼續介紹,不然今天這篇內容會太長。

小結

今天簡單說明了部屬的必要性,以及需要注意的事項,實際部屬的部分明天再繼續。


上一篇
[Day 22] bot 指令管理 (二):Extension
下一篇
[Day 24] 部屬 (二):Render
系列文
用 Python 打造你的 Discord BOT31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言